home *** CD-ROM | disk | FTP | other *** search
/ MacFormat 1996 March / macformat-035.iso / Shareware City / Developers / ICAppSourceKit1.2 / ICPopupWhats.p < prev    next >
Encoding:
Text File  |  1995-11-07  |  7.6 KB  |  265 lines  |  [TEXT/CWIE]

  1. unit ICPopupWhats;
  2.  
  3. interface
  4.  
  5.     uses
  6.         ICWindowGlobals;
  7.  
  8.     function WhatOpenPopup (wt: WindowType; item: integer): OSErr;
  9.     function WhatFlushPopup (wt: WindowType; item: integer): OSErr;
  10.     function WhatClosePopup (wt: WindowType; item: integer): OSErr;
  11.     function WhatClickPopup (wt: WindowType; item: integer; er: eventRecord): OSErr;
  12.  
  13. implementation
  14.  
  15.     uses
  16.         ICTypes, ICStrH, Dialogs, TextUtils,
  17.  
  18.         ICDialogs, ICMiscSubs, ICSubs, ICAPI, ICDocument {X}, ICMovableModal;
  19.  
  20.     procedure InternalSetItem (mh: MenuHandle; item_num: integer; text: Str255);
  21.     begin
  22.         Delete(text, TPPos(':', text), 255);
  23.         SetMenuItemText(mh, item_num, text);
  24.     end; (* InternalSetItem *)
  25.  
  26.     procedure SafeAppendMenu (mh: MenuHandle; text: str255);
  27.     begin
  28.         AppendMenu(mh, 'fred');
  29.         InternalSetItem(mh, CountMItems(mh), text);
  30.     end;
  31.  
  32.     procedure SafeInsertMenuItem (mh: MenuHandle; after: integer; text: str255);
  33.     begin
  34.         InsertMenuItem(mh, 'fred', after);
  35.         InternalSetItem(mh, after, text);
  36.     end;
  37.  
  38.     procedure AdjustPopupMenu (dlg: DialogPtr; item: integer);
  39.         var
  40.             control: ControlHandle;
  41.             menuh: MenuHandle;
  42.             servers: handle;
  43.             server: str255;
  44.             servers_count, menu_count, i, found: integer;
  45.             longmenu: boolean;
  46.     begin
  47.         control := GetDControlHandle(dlg, item);
  48.         menuh := GetPopupMHandle(dlg, item);
  49.         servers := handle(control^^.contrlRfCon);
  50.         menu_count := CountMItems(menuh);
  51.         servers_count := CountStrsH(servers);
  52.  
  53.         if menu_count = 0 then begin
  54.             for i := 2 to servers_count do begin
  55.                 SafeAppendMenu(menuh, GetIndStrH(servers, i));
  56.             end;
  57.             AppendMenu(menuh, '(-');
  58.             AppendMenu(menuh, GetAString(128, 2));
  59.             menu_count := CountMItems(menuh);
  60.         end;
  61.         found := -1;
  62.         server := GetIndStrH(servers, 1);
  63.         for i := 2 to servers_count do begin
  64.             if server = GetIndStrH(servers, i) then begin
  65.                 found := i;
  66.                 leave;
  67.             end;
  68.         end;
  69.         longmenu := menu_count = servers_count + 3;
  70.         if found > 0 then begin
  71.             if longmenu then begin
  72.                 DeleteMenuItem(menuh, 1);
  73.                 DeleteMenuItem(menuh, 1);
  74.                 SetDCtlValue(dlg, item, GetDCtlValue(dlg, item) - 2);
  75.             end;
  76.             SetControlMaximum(GetDControlHandle(dlg, item), CountMItems(menuh));
  77.             SetDCtlValue(dlg, item, found - 1);
  78.         end else begin
  79.             if not longmenu then begin
  80.                 InsertMenuItem(menuh, '(-;fred', 0);
  81.                 SetDCtlValue(dlg, item, GetDCtlValue(dlg, item) + 2);
  82.             end;
  83.             InternalSetItem(menuh, 1, GetIndStrH(servers, 1));
  84.             SetControlMaximum(GetDControlHandle(dlg, item), CountMItems(menuh));
  85.             SetDCtlValue(dlg, item, 1);
  86.         end;
  87.         EnableItem(menuh, GetDCtlValue(dlg, item));
  88.     end;
  89.  
  90.     function UsingName (servers: Handle; name: Str255): boolean;
  91.         var
  92.             tmpstr: Str255;
  93.             i: integer;
  94.     begin
  95.         UsingName := false;
  96.         for i := 2 to CountStrsH(servers) do begin
  97.             tmpstr := GetIndStrH(servers, i);
  98.             Delete(tmpstr, TPPos(':', tmpstr), 255);
  99.             if IUEqualString(tmpstr, name) = 0 then begin
  100.                 UsingName := true;
  101.                 leave;
  102.             end; (* if *)
  103.         end; (* for *)
  104.     end; (* UsingName *)
  105.  
  106.     var
  107.         ask_filter_globals: Handle;
  108.  
  109.     function AskServerFilter (dlog: DialogPtr; var event: EventRecord; var item: integer): boolean;
  110.         var
  111.             dim_ok: boolean;
  112.             name_string, host_string: Str255;
  113.     begin
  114.         GetItemText(dlog, 4, name_string);
  115.         GetItemText(dlog, 5, host_string);
  116.         dim_ok := (name_string = '') | (host_string = '') | UsingName(ask_filter_globals, name_string);
  117.         SetDCtlEnable(dlog, ok, not dim_ok);
  118.         OutlineDefault1(dlog, 3);
  119.         AskServerFilter := CancelModalFilter(dlog, event, item);
  120.     end; (* AskServerFilter *)
  121.  
  122.     function AskOtherServer (archie_popup: boolean; servers: Handle; var server: Str255): boolean;
  123.         var
  124.             modal: DialogPtr;
  125.             result: boolean;
  126.             item: integer;
  127.             tmpstr: Str255;
  128.             saved_state: Ptr;
  129.     begin
  130.         result := false;
  131.         modal := GetNewDialog(400, nil, WindowPtr(-1));
  132.         if modal <> nil then begin
  133.             ParamText(GetAString(128, 3 + ord(archie_popup)), '', '', '');
  134.             SelectDialogItemText(modal, 4, 0, 32767);
  135.             SetUpDefaultOutline(modal, ok, 3);
  136.             if archie_popup then begin
  137.                 HideDialogItem(modal, 6);
  138.                 HideDialogItem(modal, 10);
  139.             end; (* if *)
  140.             ShowWindow(modal);
  141.             DisableMenuBar(saved_state, -1);
  142.             InitCursor;
  143.             ask_filter_globals := servers;
  144.             repeat
  145.                 MovableModalDialog(@AskServerFilter, item);
  146.             until item in [ok, cancel];
  147.             result := (item = ok);
  148.             if result then begin
  149.                 GetItemText(modal, 4, server);
  150.                 GetItemText(modal, 5, tmpstr);
  151.                 server := concat(server, ':', tmpstr);
  152.                 GetItemText(modal, 6, tmpstr);
  153.                 server := concat(server, ':', tmpstr);
  154.             end; (* if *)
  155.             ReEnableMenuBar(saved_state);
  156.             DisposeWindow(modal);
  157.         end; (* if *)
  158.         AskOtherServer := result;
  159.     end; (* AskOtherServer *)
  160.  
  161.     const
  162.         pf_archie = 0;
  163.         pf_archie_mask = $0001;
  164.  
  165.     function WhatClickPopup (wt: WindowType; item: integer; er: eventRecord): OSErr;
  166.         var
  167.             dlg: WindowPtr;
  168.             value: integer;
  169.             control: ControlHandle;
  170.             menuh: MenuHandle;
  171.             servers: handle;
  172.             server: str255;
  173.             servers_count, menu_count: integer;
  174.             longmenu: boolean;
  175.             archie_popup: boolean;
  176.     begin
  177.         er := er; { Unused }
  178.         dlg := windowinfo[wt].window;
  179.         control := GetDControlHandle(dlg, item);
  180.         menuh := GetPopupMHandle(dlg, item);
  181.         servers := handle(control^^.contrlRfCon);
  182.         menu_count := CountMItems(menuh);
  183.         servers_count := CountStrsH(servers);
  184.         longmenu := (menu_count = servers_count + 3);
  185.  
  186.         value := GetDCtlValue(dlg, item);
  187.         if value = menu_count then begin
  188.             archie_popup := TPbtst(windowinfo[wt].items[item]^.flags, pf_archie);
  189.             if AskOtherServer(archie_popup, servers, server) then begin
  190.                 SetIndStrH(servers, 1, server);
  191.             end; (* if *)
  192.             AdjustPopupMenu(dlg, item);
  193.         end else begin
  194.             value := value - 2 * ord(longmenu);
  195.             if value > 0 then begin
  196.                 server := GetIndStrH(servers, value + 1);
  197.                 SetIndStrH(servers, 1, server);
  198.                 AdjustPopupMenu(dlg, item);
  199.             end;
  200.         end;
  201.         WhatClickPopup := noErr;
  202.     end; (* WhatClickPopup *)
  203.  
  204.     function WhatOpenPopup (wt: WindowType; item: integer): OSErr;
  205.         var
  206.             dlg: WindowPtr;
  207.             server: str255;
  208.             servers: handle;
  209.             keybase: Str255;
  210.             attr: longint;
  211.             err: OSErr;
  212.     begin
  213.         err := noErr;
  214.         keybase := windowinfo[wt].items[item]^.key;
  215.         servers := nil;
  216.         if ICGetPrefHandle(GetInstance, concat(keybase, 'All'), attr, servers) <> noErr then begin
  217.             servers := NewStrH;
  218.             if servers = nil then begin
  219.                 err := memFullErr;
  220.             end; (* if *)
  221.         end; (* if *)
  222.         if ICGetPrefStr(GetInstance, concat(keybase, 'Preferred'), attr, server) <> noErr then begin
  223.             server := GetIndStrH(servers, 1);
  224.         end; (* if *)
  225.         ProcessAttributes(wt, item, attr);
  226.         dlg := windowinfo[wt].window;
  227.         GetDControlHandle(dlg, item)^^.contrlRfCon := longint(servers);
  228.         InsIndStrH(servers, 1, server);
  229.         AdjustPopupMenu(dlg, item);
  230.         SetDCtlEnable(dlg, item, not IsLocked(wt, item));
  231.         WhatOpenPopup := err;
  232.     end; (* WhatOpenPopup *)
  233.  
  234.     function WhatFlushPopup (wt: WindowType; item: integer): OSErr;
  235.         var
  236.             dlg: WindowPtr;
  237.             server: Str255;
  238.             old_server: Str255;
  239.             keybase: Str255;
  240.             err: OSErr;
  241.             attr: longint;
  242.     begin
  243.         dlg := windowinfo[wt].window;
  244.         server := GetIndStrH(Handle(GetDControlHandle(dlg, item)^^.contrlRfCon), 1);
  245.         keybase := windowinfo[wt].items[item]^.key;
  246.         if ICMapErr(ICGetPrefStr(GetInstance, concat(keybase, 'Preferred'), attr, old_server)) <> noErr then begin
  247.             old_server := '::';
  248.         end; (* if *)
  249.         err := noErr;
  250.         if server <> old_server then begin
  251.             err := ICMapErr(ICSetPrefStr(GetInstance, concat(keybase, 'Preferred'), ICattr_no_change, server));
  252.             if err = noErr then begin
  253.                 DirtyDocument;
  254.             end; (* if *)
  255.         end; (* if *)
  256.         WhatFlushPopup := err;
  257.     end; (* WhatFlushPopup *)
  258.  
  259.     function WhatClosePopup (wt: WindowType; item: integer): OSErr;
  260.     begin
  261.         DisposeHandle(Handle(GetDControlHandle(windowinfo[wt].window, item)^^.contrlRfCon));
  262.         WhatClosePopup := noErr;
  263.     end; (* WhatClosePopup *)
  264.  
  265. end. (* ICPopupWhats *)